home *** CD-ROM | disk | FTP | other *** search
/ Aminet 19 / Aminet 19 (1997)(GTI - Schatztruhe)[!][Jun 1997].iso / Aminet / gfx / misc / PowerCrawler.lha / PowerCrawler / Developer / ExampleIO.s < prev    next >
Text File  |  1996-05-21  |  9KB  |  387 lines

  1. ;*******************************************************************
  2. ;*                                                                 *
  3. ;* Example of an external IO-Routine for the PowerCrawler:         *
  4. ;*                                                                 *
  5. ;* (done with the PhxAss!)                                         *
  6. ;*  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯                                          *
  7. ;*             RAW-LOADER/SAVER                           *
  8. ;*                                                                 *
  9. ;* Format:                                                         *
  10. ;*            Offset   Data                                        *
  11. ;*            ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯                                *
  12. ;*            0        Map-Width.w                                 *
  13. ;*            2        Map-Height.w                                *
  14. ;*            4        Map-Layers.w                                *
  15. ;*            6        Block-Width.w                               *
  16. ;*            8        Block-Height.w                              *
  17. ;*            10       Bytes per Block.b (1=Byte,2=Word)           *
  18. ;*            11       Transparent Block.b (0 = 0 ; 1 = -1)        *
  19. ;*            12       Map-Data:                                   *
  20. ;*                       Row 1 Layer 1                             *
  21. ;*                       Row 2 Layer 1                   *
  22. ;*                       Row . Layer 1                   *
  23. ;*             Row n Layer 1                   *
  24. ;*                                   *
  25. ;*             Row 1 Layer 2                   *
  26. ;*             Row 2 Layer 2                   *
  27. ;*             Row . Layer 2                   *
  28. ;*             Row n Layer 2                   *
  29. ;*                                    *
  30. ;*             Row 1 Layer .                   *
  31. ;*             Row 2 Layer .                   *
  32. ;*             Row . Layer .                   *
  33. ;*             Row n Layer .                   *
  34. ;*                                    *
  35. ;*             Row 1 Layer n                   *
  36. ;*             Row 2 Layer n                   *
  37. ;*             Row . Layer n                   *
  38. ;*             Row n Layer n                   *
  39. ;*                                                                 *
  40. ;*******************************************************************
  41.  
  42.  
  43.     org    0                ; ABSOLUTE MODE!
  44.  
  45.     FILE    "PowerCrawler:ExternalIO/raw.io"; absolute Code will be
  46.                         ; saved into this file
  47.     incdir    "include"
  48.     include "exec/exec.i"
  49.     include    "dos/dos.i"
  50.     include "lvo/dos_lib.i"
  51.     include "lvo/exec_lib.i"
  52.     include    "misc/PowerCrawler.i"
  53.     
  54.  
  55.  
  56.  
  57. ;===================================================================
  58.  
  59. ;-------------------------------------------------------------------
  60. ;            RECOGNITION
  61. ;-------------------------------------------------------------------
  62.  
  63.  
  64. START:
  65.     dc.b     'PCEX'                ; for RECOGNITION
  66.  
  67.  
  68. ;------------------------------------------------------------------
  69. ;            BRANCH INTO CODE
  70. ;
  71. ;Must be 4 Bytes long. If you use <bra.s    Main> then add a nop!!
  72. ;------------------------------------------------------------------
  73.  
  74.  
  75. CODEENTRY:
  76.     bra.s    MAIN
  77.     nop
  78.  
  79.     
  80.  
  81. ;-------------------------------------------------------------------
  82. ;            ACTION_CODE
  83. ;
  84. ;PowerCrawler will put PC_IO_LOADMAP or PC_IO_SAVEMAP here. Check it in
  85. ;your code to know whether you have to save or load a Map.
  86. ;------------------------------------------------------------------
  87.  
  88.  
  89. ACTIONCODE:
  90.     dc.w    0
  91.  
  92.     
  93. ;------------------------------------------------------------------
  94. ;            RETURN_CODE
  95. ;
  96. ;Put in PC_RETURN_???? before leaving
  97. ;------------------------------------------------------------------
  98.  
  99.  
  100. RETURNCODE:
  101.     dc.w    0
  102.     
  103. ;------------------------------------------------------------------
  104. ;            RESERVED
  105. ;
  106. ;Is reserved !!!
  107. ;------------------------------------------------------------------
  108.  
  109. RESERVED1:    dc.l 0
  110. RESERVED2:    dc.l 0
  111. RESERVED3:    dc.l 0
  112.  
  113. ;------------------------------------------------------------------
  114. ;            ACTION-VAR
  115. ;
  116. ; Points to the Filename the user wants to load/save.
  117. ;------------------------------------------------------------------
  118.  
  119. ACTIONVAR:
  120.     dc.l    0        ;will point to FileName
  121.  
  122.  
  123. ;------------------------------------------------------------------
  124. ;            MAIN-CODE
  125. ;
  126. ; Note: Everything must be PC-relative! Initialize the variables,
  127. ;     cause the code is only loaded once and NOT each time
  128. ;    it is used.
  129. ;------------------------------------------------------------------
  130.  
  131.  
  132. MAIN:
  133.     lea    Vars(pc),a4
  134.     move.l    4(sp),a5        ;Get Pointer to PCInformation
  135.                     ;Structure (see Powercrawler.i)
  136.                     
  137.     move.l    pci_DosBase(a5),a6    ;Get DosBase
  138.     move    ACTIONCODE(pc),d0
  139.     cmp    #PC_IO_LOADMAP,d0
  140.     beq.s    LoadMap
  141.     cmp    #PC_IO_SAVEMAP,d0
  142.     beq.s    SaveMap
  143.     cmp    #PC_IO_GETINFO,d0
  144.     beq    GetInfo
  145.     moveq    #PC_RETURN_ERROR,d0
  146. ExitRoutine:
  147.     lea    RETURNCODE(pc),a0
  148.     move    d0,(a0)
  149.     rts
  150.     
  151. LoadMap:
  152.     move.l    ACTIONVAR(pc),d1
  153.     move.l    #MODE_OLDFILE,d2
  154.     jsr    _LVOOpen(a6)        ;Open File
  155.     move.l    d0,FileHandle-Vars(a4)
  156.     tst.l    d0
  157.     bne.s    LoadMap1
  158.     moveq    #PC_RETURN_DOSERROR,d0
  159.     bra.s    ExitRoutine
  160.     
  161. LoadMap1:
  162.     move.l    d0,d1
  163.     moveq    #0,d2
  164.     move.l    #OFFSET_END,d3
  165.     jsr    _LVOSeek(a6)
  166.  
  167.     move.l    FileHandle(pc),d1
  168.     moveq    #0,d2
  169.     move.l    #OFFSET_BEGINNING,d3
  170.     jsr    _LVOSeek(a6)
  171.     move.l    d0,FileSize-Vars(a4)    ;Get File-Length
  172.     
  173.     move.l    FileHandle(pc),d1
  174.     lea    FileHeader(pc),a2
  175.     move.l    a2,d2
  176.     moveq    #12,d3
  177.     jsr    _LVORead(a6)        ;Read File-Header
  178.     cmp.l    #12,d0
  179.     beq.s    LoadMap2
  180.     bsr.s    CloseFH
  181.     moveq    #PC_RETURN_READERROR,d0
  182.     bra.s    ExitRoutine
  183.  
  184. LoadMap2:
  185.     move.l    4.w,a6
  186.     move.l    FileSize(pc),d0
  187.     sub.l    #12,d0
  188.     move.l    #MEMF_ANY,d1
  189.     jsr    _LVOAllocVec(a6)    ;Alloc new MapBuffer;
  190.     move.l    d0,NewMapBuffer-Vars(a4)
  191.     tst.l    d0
  192.     bne.s    LoadMap3
  193.     bsr    CloseFH
  194.     moveq    #PC_RETURN_NOMEMORY,d0
  195.     bra    ExitRoutine
  196.     
  197. LoadMap3:
  198.     move.l    pci_DosBase(a5),a6
  199.     move.l    FileHandle(pc),d1
  200.     move.l    NewMapBuffer(pc),d2
  201.     move.l    FileSize(pc),d3
  202.     sub.l    #12,d3
  203.     jsr    _LVORead(a6)        ;Read new MapBuffer;
  204.     sub.l    FileSize(pc),d0
  205.     add.l    #12,d0
  206.     beq.s    LoadMap4
  207.     bsr    FreeBuffer
  208.     bsr    CloseFH
  209.     moveq    #PC_RETURN_READERROR,d0
  210.     bra    ExitRoutine
  211.     
  212. LoadMap4:
  213.     bsr    CloseFH
  214.     move.l    pci_MapBuffer(a5),a1
  215.     cmp.l    #0,a1
  216.     beq.s    LoadMap5
  217.     move.l    4.w,a6
  218.     jsr    _LVOFreeVec(a6)        ;Kill old MapBuffer
  219.  
  220. LoadMap5:
  221.     move.l    NewMapBuffer(pc),d2
  222.     move.l    d2,pci_MapBuffer(a5)    ;Set to new pointer
  223.     
  224.     lea    FileHeader(pc),a0
  225.     lea    pci_MapData(a5),a1
  226.     moveq    #0,d0
  227.  
  228.     move    (a0)+,d0        ;Fill-in pci_MapDat-Structure
  229.     move.l    d0,pcd_MapWidth(a1)
  230.     move    (a0)+,d0
  231.     move.l    d0,pcd_MapHeight(a1)
  232.     move    (a0)+,d0
  233.     move.b    d0,pcd_Layers(a1)
  234.     move    (a0)+,d0
  235.     move.b    d0,pcd_BlockSizeX(a1)
  236.     move    (a0)+,d0
  237.     move.b    d0,pcd_BlockSizeY(a1)
  238.     move.b    (a0)+,d0
  239.     move.b    d0,pcd_MemoryType(a1)
  240.     move.b    (a0)+,d0
  241.     move.b    d0,pcd_TransparentBlock(a1)
  242.     moveq    #PC_RETURN_OK,d0
  243.     bra    ExitRoutine
  244.     
  245.  
  246.  
  247. ;******************************************************************
  248.  
  249. SaveMap:
  250.     move.l    pci_MapBuffer(a5),d0
  251.     bne.s    SaveMap0
  252.     
  253.     moveq    #PC_RETURN_NOMAPBUFFER,d0
  254.     bra    ExitRoutine
  255.     
  256. SaveMap0:
  257.     
  258.     move.l    pci_DosBase(a5),a6
  259.     move.l    ACTIONVAR(pc),d1
  260.     move.l    #MODE_NEWFILE,d2
  261.     jsr    _LVOOpen(a6)        ;Open new file
  262.  
  263.     move.l    d0,FileHandle-Vars(a4)
  264.     tst.l    d0
  265.     bne.s    SaveMap1
  266.     moveq    #PC_RETURN_DOSERROR,d0
  267.     bra    ExitRoutine
  268.     
  269. SaveMap1:
  270.     lea    pci_MapData(a5),a0
  271.     lea    FileHeader(pc),a1    ;Fill in FileHeader
  272.     move.l    a1,d2
  273.     move.l    pcd_MapWidth(a0),d0
  274.     move    d0,(a1)+
  275.     move.l    pcd_MapHeight(a0),d0
  276.     move    d0,(a1)+
  277.     moveq    #0,d0
  278.     move.b    pcd_Layers(a0),d0
  279.     move    d0,(a1)+
  280.     move.b    pcd_BlockSizeX(a0),d0
  281.     move    d0,(a1)+
  282.     move.b    pcd_BlockSizeY(a0),d0
  283.     move    d0,(a1)+
  284.     move.b    pcd_MemoryType(a0),d0
  285.     move.b    d0,(a1)+
  286.     move.b    pcd_TransparentBlock(a0),d0
  287.     move.b    d0,(a1)+
  288.     
  289.     move.l    FileHandle(pc),d1
  290.     move.l    #12,d3
  291.     jsr    _LVOWrite(a6)
  292.     cmp.l    #12,d0
  293.     beq.s    SaveMap2
  294.     
  295.     bsr    CloseFH
  296.     moveq    #PC_RETURN_WRITEERROR,d0
  297.     bra    ExitRoutine
  298.  
  299. SaveMap2:
  300.     move.l    FileHandle(pc),d1
  301.     move.l    pci_MapBuffer(a5),d2
  302.     lea    pci_MapData(a5),a0
  303.     move.l    pcd_MapWidth(a0),d3
  304.     move.l    pcd_MapHeight(a0),d4
  305.     mulu    d4,d3
  306.     move.l    d3,d5
  307.     moveq    #0,d4
  308.     move.b    pcd_Layers(a0),d4
  309.     subq    #2,d4
  310.     blt.s    SaveMap32
  311.  
  312. SaveMap3:
  313.     add.l    d5,d3
  314.     dbf    d4,SaveMap3
  315. SaveMap32:
  316.     moveq    #0,d4
  317.     move.b    pcd_MemoryType(a0),d4
  318.     subq    #2,d4
  319.     blt.s    SaveMap4
  320. SaveMap33:
  321.     add.l    d3,d3
  322.     dbf    d4,SaveMap33
  323.  
  324. SaveMap4:
  325.     move.l    d3,d7
  326.     jsr    _LVOWrite(a6)
  327.     cmp.l    d0,d7
  328.     beq.s    SaveMap5
  329.     
  330.     bsr    CloseFH
  331.     moveq    #PC_RETURN_WRITEERROR,d0
  332.     bra    ExitRoutine
  333.     
  334. SaveMap5:
  335.     bsr    CloseFH
  336.     moveq    #PC_RETURN_OK,d0
  337.     bra    ExitRoutine
  338.     
  339. CloseFH:
  340.     move.l    pci_DosBase(a5),a6
  341.     move.l    FileHandle(pc),d1
  342.     jsr    _LVOClose(a6)
  343.     rts
  344.  
  345. FreeBuffer:
  346.     move.l    4.w,a6
  347.     move.l    NewMapBuffer(pc),a1
  348.     jsr    _LVOFreeVec(a6)
  349.     rts
  350.     
  351.  
  352. ;******************************************************************
  353.  
  354. GetInfo:
  355.     lea    ACTIONVAR(pc),a0
  356.     lea    MyInfoText(pc),a1
  357.     move.l    a1,(a0)
  358.     moveq    #PC_RETURN_OK,d0
  359.     bra    ExitRoutine
  360.  
  361. ;******************************************************************
  362.  
  363. Vars:
  364.  
  365. FileHandle:    dc.l 0
  366. FileSize:    dc.l 0
  367. FileHeader:    blk.w 6,0
  368. FileBuffer:    dc.l 0
  369. NewMapBuffer:    dc.l 0
  370. MyInfoText:    dc.b '*** Raw.io by Steger Georg ***',10
  371.         dc.b 10
  372.         dc.b 'Format:',10
  373.         dc.b '           Offset   Data',10
  374.         dc.b '           ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯',10
  375.         dc.b '           0        Map-Width.w',10
  376.         dc.b '           2        Map-Height.w',10
  377.         dc.b '           4        Map-Layers.w',10
  378.         dc.b '           6        Block-Width.w',10
  379.         dc.b '           8        Block-Height.w',10
  380.         dc.b '           10       Bytes per Block.b (1=Byte, 2=Word)',10
  381.         dc.b '           11       Transparent Block.b (0=0, 1=-1)',10
  382.         dc.b '           12       Map-Data:',10
  383.         dc.b '                      Layer 1 all',10
  384.         dc.b '                      Layer 2 all',10
  385.         dc.b '                      Layer . all',10
  386.         dc.b '                      Layer n all',10
  387.         dc.b 0